//package com.xw.verticles;
//
//import com.xw.publish.ChannelManager;
//import com.xw.publish.PublishManager;
//import com.xw.service.Jtt1078Decoder;
//import com.xw.service.SessionManager;
//import com.xw.util.Packet;
//import io.netty.buffer.*;
//import io.vertx.core.AbstractVerticle;
//import io.vertx.core.Vertx;
//import io.vertx.core.buffer.Buffer;
//import io.vertx.core.net.NetServer;
//import io.vertx.core.net.NetServerOptions;
//import io.vertx.core.net.NetSocket;
//import lombok.extern.slf4j.Slf4j;
//
//import java.util.ArrayList;
//import java.util.List;
//import java.util.concurrent.ConcurrentHashMap;
//
//
//@Slf4j
//public class MediaVerticleOld extends AbstractVerticle {
//
//  byte[] block = new byte[4096];
//  private final ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();
//  private final ConcurrentHashMap<String, Jtt1078Decoder> jtt1078DecoderMap = new ConcurrentHashMap<>();
//
//  @Override
//  public void start() throws Exception {
//    super.start();
//    // 创建TCP服务器
//    NetServerOptions options = new NetServerOptions();
//    options.setRegisterWriteHandler(true);
//    NetServer server = vertx.createNetServer(options);
//
//    // 处理连接请求
//    server.connectHandler(socket -> {
//      String clientId = socket.writeHandlerID();
//      socket.handler(buffer -> {
//        List<Packet> packageList = this.decodePackage(buffer, clientId);
//        for (Packet packet : packageList) {
//          publish(packet, socket, vertx, clientId);
//        }
//      });
//
//      // 监听客户端的退出连接
//      socket.closeHandler(close -> {
//        if (map.containsKey(clientId)) {
//          String tag = map.get(clientId);
//          ChannelManager.getInstance().close(tag);
//          map.remove(clientId);
//          jtt1078DecoderMap.remove(clientId);
//        }
//      });
//
//    });
//
//    int point = 5555;
//    // 监听端口
//    server.listen(point, res -> {
//      if (res.succeeded()) {
//        log.info("服务器启动成功，端口号：{}", point);
//      }
//    });
//  }
//
//
//  private List<Packet> decodePackage(Buffer inData, String clientId) {
//    ByteBuf in = Unpooled.directBuffer(inData.length());
//    in.writeBytes(inData.getBytes());
//
//    int length = in.readableBytes();
//    List<Packet> out = new ArrayList<>();
//    Jtt1078Decoder decoder = this.jtt1078DecoderMap.computeIfAbsent(clientId, k -> new Jtt1078Decoder());
//    for (int i = 0, k = (int) Math.ceil(length / 512f); i < k; i++) {
//      int l = i < k - 1 ? 512 : length - (i * 512);
//      in.readBytes(block, 0, l);
//
//      decoder.write(block, 0, l);
//
//      while (true) {
//        Packet p = decoder.decode();
//        if (p == null) break;
//        out.add(p);
//      }
//    }
//    in.release();
//    return out;
//  }
//
//  private void publish(Packet packet, NetSocket socket, Vertx vertx, String clientId) {
//    packet.seek(8);
//    String sim = packet.nextBCD() + packet.nextBCD() + packet.nextBCD() + packet.nextBCD() + packet.nextBCD() + packet.nextBCD();
//    int channel = packet.nextByte() & 0xff;
//    String tag = sim + "-" + channel;
//    map.put(clientId, tag);
//
//    if (!SessionManager.contains(socket.writeHandlerID(), "tag")) {
//      //Channel chl = ChannelManager.getInstance().open(tag, vertx);
//      PublishManager.getInstance().open(tag, vertx);
//      SessionManager.set(socket.writeHandlerID(), "tag", tag);
//      SessionManager.setChannel(socket, tag);
//    }
//
//    Integer sequence = SessionManager.get(socket.writeHandlerID(), "video-sequence");
//    if (sequence == null) sequence = 0;
//    // 1. 做好序号
//    // 2. 音频需要转码后提供订阅
//    int lengthOffset = 28;
//    int dataType = (packet.seek(15).nextByte() >> 4) & 0x0f;
//    int pkType = packet.seek(15).nextByte() & 0x0f;
//    // 透传数据类型：0100，没有后面的时间以及Last I Frame Interval和Last Frame Interval字段
//    if (dataType == 0x04) lengthOffset = 28 - 8 - 2 - 2;
//    else if (dataType == 0x03) lengthOffset = 28 - 4;
//
//    int pt = packet.seek(5).nextByte() & 0x7f;
//
//    if (dataType == 0x00 || dataType == 0x01 || dataType == 0x02) {
//      // 碰到结束标记时，序号+1
//      if (pkType == 0 || pkType == 2) {
//        sequence += 1;
//        SessionManager.set(socket.writeHandlerID(), "video-sequence", sequence);
//      }
//      long timestamp = packet.seek(16).nextLong();
//      byte[] data = packet.seek(lengthOffset + 2).nextBytes();
//
//      //ChannelManager.getInstance().publishVideo(tag, sequence, timestamp, pt, data);
//      PublishManager.getInstance().publishVideo(tag, sequence, timestamp, pt, data);
//    } else if (dataType == 0x03) {
//      long timestamp = packet.seek(16).nextLong();
//      byte[] data = packet.seek(lengthOffset + 2).nextBytes();
//      //PublishManager.getInstance().publishAudio(tag, sequence, timestamp, pt, data);
//    }
//
//  }
//}
